﻿const localStorageMock = {
    getItem: jest.fn(),
    setItem: jest.fn(),
    removeItem: jest.fn(),
    clear: jest.fn(),
};

global.localStorage = localStorageMock;

Object.defineProperty(URL, 'createObjectURL', {
    writable: true,
    value: jest.fn(),
});

class Worker {
    constructor(stringUrl) {
        this.url = stringUrl;
        this.onmessage = () => {};
    }

    postMessage(msg) {
        this.onmessage(msg);
    }
}

window.Worker = Worker;

/* eslint-disable global-require */
if (typeof window !== 'undefined') {
    // ref: https://github.com/ant-design/ant-design/issues/18774
    if (!window.matchMedia) {
        Object.defineProperty(global.window, 'matchMedia', {
            writable: true,
            configurable: true,
            value: jest.fn(() => ({
                matches: false,
                addListener: jest.fn(),
                removeListener: jest.fn(),
            })),
        });
    }
    if (!window.matchMedia) {
        Object.defineProperty(global.window, 'matchMedia', {
            writable: true,
            configurable: true,
            value: jest.fn((query) => ({
                matches: query.includes('max-width'),
                addListener: jest.fn(),
                removeListener: jest.fn(),
            })),
        });
    }
}
const errorLog = console.error;
Object.defineProperty(global.window.console, 'error', {
    writable: true,
    configurable: true,
    value: (...rest) => {
        const logStr = rest.join('');
        if (logStr.includes(
            'Warning: An update to %s inside a test was not wrapped in act(...)')) {
            return;
        }
        errorLog(...rest);
    },
});
